package com.wfm.files;

import java.io.IOException;
import java.io.RandomAccessFile;

/**
 * \r-13 CR 回车
 * \n-10 LF 换行
 * filePointer默认是从0到length-1的，跟数组下标一样
 * 换行在windows里是\r\n，所以文件字节数会多两个，
 * 如果输出\r,那么不会换行
 * 如果输出\n，则会换行
 * 如果输出\r\n，则会换行
 * 找到文件的下标seek后，写入是覆盖写、
 */
public class AccessFileDemo {
	public static void main(String[] args) throws IOException {
		String fileName = "access.txt";//"12345\r\n"
		
//		File file = new File(fileName);
//		RandomAccessFile io = new RandomAccessFile(file, "rw");
		//RandomAccessFile 有两个构造函数，平时使用为了简单可以用下面这种
		RandomAccessFile io = new RandomAccessFile(fileName, "rw");

		System.out.println("刚开始指针0："+io.getFilePointer());

		byte readChar = io.readByte();
		System.out.println("读一个字节1："+(char)readChar);//输出"a" ,不转为char类型的话输出 97 "a"对应的ASCII值
		System.out.println("读了一个字节后指针是1："+io.getFilePointer());

		long length = io.length();//文件的大小（字节）因为后面有\r\n，所以是7
		System.out.println("文件字节数7："+length);
		
		io.seek(length-1);//设置指针位置为最后一个字节之前
		System.out.println("设置指针位置为最后一个字节，即指向\\n："+io.getFilePointer());
		
		int read = io.read();
		System.out.print((char)read);//输出h即最后一位字母
		/*
		 * 目前来看io.seek(int len);作用于skip一样
		 * 重点在于seek相对于 skip效率更高 而且可以随意指定位置，而skip只能丢弃 不能回滚
		 * 看下方例子
		 */
		
//		io.seek(2);
//		int read2 = io.read();
//		System.out.println((char)read2);//这里输出d
//
//		io.seek(length);
//		io.write(97);//在文件末尾写入97 "a"的ASCII码值 此时 文件内为"asdfgha"
//
//		io.seek(0);
//		io.write(98);//在文件开头写入98 "b"的ASCII码值 此时 文件内为"bsdfgha"
		//该流并不会在文件之前加入内容 而是在指针位置开始重写文件内容，之前的位置则被覆盖掉
		
		
		/**
		 * io.read() 与 io.readByte()作用相同 都是读取一个字节的数据 
		 * io.readInt();读取一个int值 4个字节
		 */
		
	}
}